#include <iostream>
#include <unistd.h>

//解决僵尸进程
//僵尸进程原因就是儿子死了，父亲没收尸(没调用wait或waitpid)
//解决原理就是把儿子的父亲变为init，儿子死后让init帮忙收尸。
//方案，使用两次fork

int main(){
    pid_t childPid;
    childPid = fork();
    if(childPid < 0){
        printf("fork error\n");
        exit(0);
    }else if(childPid == 0){
        //first child
        pid_t secondPid;
        secondPid = fork();
        if(secondPid < 0){
            printf("second fork error\n");
            exit(0);
        }else if(secondPid == 0){
            //第二个子进程作为保留的子进程，他的父进程会变为init
            printf("im second process, getpid()=%d\n", getpid());
            exit(0);
        }else{
            //退出第一个子进程，他的子进程(第二个子进程)就会变为孤儿进程
            exit(0);
        }
    }else{
        //父进程监听第一个子进程的退出，收尸
        sleep(2);//让第一个子进程先退出，保证调用waitpid(childPid)时childPid进程已经退出了，不然会阻塞哦
        waitpid(childPid, NULL, 0);
        system("ps -o pid,ppid,state,tty,command | grep zombie_fix");
        return 0;
    }
}